package cn.ad.server.persistence;

import java.math.BigDecimal;
import java.util.List;

import cn.ad.server.domain.ad.AmountStore;
import cn.ad.server.domain.ad.GuidValueObject;
import cn.ad.server.domain.ad.Strategy;
import cn.ad.server.domain.ad.StrategyGroup;

public interface StrategyRepository {

	/**
	 * 获取指定策略当前已经完成的印象数（全部，每日），点击数（全部，每日），预算（全部，每日）
	 * @param s
	 * @return
	 */
	List<Double> findCountValue(Strategy s);
	
	@Deprecated
	void countImpressions(Strategy s);
	
	@Deprecated
	void countClick(Strategy s);

	/**
	 * 获取指定策略当前时间片的投放余量
	 * @param key
	 * @return
	 */
	Double fetchBalance(String key);

	/**
	 * 获取指定策略最后一次余量更新时间
	 * @param key
	 * @return
	 */
	long fetchUpdateTime(String key);

	void warmUpStrategy();

	/**
	 * 计算给定的时间和当前时间差几个时间间隔，默认时间间隔是三十分钟
	 * @param time
	 * @param s
	 * @return
	 */
	int bucketInterval(long time, Strategy s);

	/**
	 * 计算以CPM计费时单次展示的价格，由于CPM的价格描述为1000次展示价，所以要在元策略单价上除以1000
	 * @param unitPrice
	 * @return
	 */
	double singleCPMBudget(BigDecimal unitPrice);

	Strategy findById(long id);

	List<AmountStore> findAmounts(Strategy s);

	List<Strategy> findAvailable();

	double getTimeBucketAmount(Strategy s);

	double getStrategyGroupTimeBucketAmount(StrategyGroup sg);

	int strategyGroupBucketInterval(long time, StrategyGroup sg);

	Double fetchAmount(String key);

	void unbond();

	void countClick(GuidValueObject guidVO);

	void countImpressions(GuidValueObject guidVO);

	double singleCPMBudget(double unitPrice);

	

}
